// src/config/logger.js
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import pino from 'pino';

// 获取当前文件目录
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 日志根目录（从环境变量读取，如果没有设置则使用默认路径）
const logsDir = process.env.LOG_DIR || path.join(__dirname, '../../logs');

// 创建logs目录（如果不存在）
if (!fs.existsSync(logsDir)) {
  fs.mkdirSync(logsDir, { recursive: true });
}

// 日志级别配置
const LOG_LEVELS = {
  fatal: 60,
  error: 50,
  warn: 40,
  info: 30,
  debug: 20,
  trace: 10
};

// 获取当前日志级别，默认为 info
const getCurrentLogLevel = () => {
  const logLevel = process.env.LOG_LEVEL || 'info';
  return LOG_LEVELS[logLevel] !== undefined ? logLevel : 'info';
};

// 生成当前日期的日志文件名
const generateLogFileName = (date) => {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `app-${year}-${month}-${day}.log`;
};

// 获取当前日志文件路径
const getCurrentLogFilePath = () => {
  const logFileName = generateLogFileName(new Date());
  return path.join(logsDir, logFileName);
};

// 清理过期的日志文件（保留最近30个）
const cleanupOldLogs = () => {
  try {
    const files = fs.readdirSync(logsDir)
      .filter(file => file.startsWith('app-') && file.endsWith('.log'))
      .map(file => ({
        name: file,
        path: path.join(logsDir, file),
        time: fs.statSync(path.join(logsDir, file)).mtime.getTime()
      }))
      .sort((a, b) => b.time - a.time);

    // 保留最近30个文件，删除多余的
    if (files.length > 30) {
      files.slice(30).forEach(file => {
        fs.unlinkSync(file.path);
      });
    }
  } catch (err) {
    console.error('清理旧日志文件失败:', err);
  }
};

// 初始化日志系统
const initializeLogger = () => {
  // 清理过期日志
  cleanupOldLogs();

  // 创建pino日志记录器配置
  const loggerConfig = {
    level: getCurrentLogLevel(),
    transport: {
      targets: [
        // 控制台输出（格式化输出）
        {
          level: getCurrentLogLevel(),
          target: 'pino-pretty',
          options: {
            colorize: true,
            translateTime: 'SYS:standard',
            ignore: 'pid,hostname',
            singleLine: false,
            messageFormat: '[{levelLabel}] {msg}'
          }
        },
        // 文件输出
        {
          level: getCurrentLogLevel(),
          target: 'pino/file',
          options: {
            destination: getCurrentLogFilePath(),
            append: true
          }
        }
      ]
    }
  };

  return pino(loggerConfig);
};

// 创建专用的文件日志流（用于日期滚动）
const createFileLogger = () => {
  let currentDate = new Date().toISOString().split('T')[0];
  let logFilePath = getCurrentLogFilePath();

  const pinoInstance = pino(
    {
      level: getCurrentLogLevel(),
      timestamp: pino.stdTimeFunctions.isoTime,
      formatters: {
        level: (label) => {
          return { level: label };
        }
      }
    },
    pino.multistream(
      [
        // 控制台输出
        {
          stream: pino.transport({
            target: 'pino-pretty',
            options: {
              colorize: true,
              translateTime: 'SYS:standard',
              ignore: 'pid,hostname',
              messageFormat: '[{levelLabel}] {msg}'
            }
          })
        },
        // 文件输出
        {
          stream: fs.createWriteStream(logFilePath, { flags: 'a' })
        }
      ]
    )
  );

  // 定期检查日期变化，实现每天一个新文件
  const dateCheckInterval = setInterval(() => {
    const newDate = new Date().toISOString().split('T')[0];
    if (newDate !== currentDate) {
      currentDate = newDate;
      logFilePath = getCurrentLogFilePath();
      // 清理旧日志
      cleanupOldLogs();
    }
  }, 60000); // 每分钟检查一次

  // 在进程退出时清理定时器
  process.on('exit', () => {
    clearInterval(dateCheckInterval);
  });

  return pinoInstance;
};

// 导出日志配置对象（适用于Fastify）
export const logger = {
  level: getCurrentLogLevel(),
  transport: {
    targets: [
      // 控制台输出（格式化输出）
      {
        level: getCurrentLogLevel(),
        target: 'pino-pretty',
        options: {
          colorize: true,
          translateTime: 'SYS:standard',
          ignore: 'pid,hostname',
          singleLine: false,
          messageFormat: '[{levelLabel}] {msg}'
        }
      },
      // 文件输出
      {
        level: getCurrentLogLevel(),
        target: 'pino/file',
        options: {
          destination: getCurrentLogFilePath(),
          append: true
        }
      }
    ]
  }
};

// 导出日志配置信息
export const loggerConfig = {
  logsDir,
  currentLogFile: getCurrentLogFilePath(),
  logLevel: getCurrentLogLevel(),
  maxLogFiles: 30,
  getCurrentLogLevel,
  generateLogFileName,
  cleanupOldLogs
};

export default logger;
